#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
//喝汽水，1瓶汽水1元，2个空瓶可以换一瓶汽水，
//给20元，可以多少汽水（编程实现）
//int main()
//{
//
//	int total = 0;
//	int empty = 0;
//
//	int money = 0;
//	scanf("%d", &money);
//	total = money;  //20
//	empty = money;  //20
//	//20 -- 20
//
//	while (empty > 1)
//	{	
//		money = empty / 2;
//		empty = empty / 2 + empty % 2;
//		total += money;
//	}
//	printf("%d\n", total);
//	return 0;
//}

#if 0
int main()
{
	int i = 0;
	int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	//金丝雀
	for (i = 0; i <= 12; i++)
	{
		arr[i] = 0;
		printf("hello bit\n");
	}
	return 0;
}
#endif


//调整数组使奇数全部都位于偶数前面。
#if 0
void func(int arr[], int size)
{
	int left = 0;
	int right = size - 1;
	while (left < right)
	{
		//从左往右找偶数   
		while (left < right && arr[left] % 2 == 1)
		{
			left++;
		}

		//从右往左找奇数
		while (left < right && arr[right] % 2 == 0)
		{
			right--;
		}

		//交换
		if (left < right)
		{
			int tmp = arr[left];
			arr[left] = arr[right];
			arr[right] = tmp;
		}
	}
}

int main()
{
	int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	func(arr, 10);

	for (int i = 0; i < 10; i++)
	{
		printf("%d\n", arr[i]);
	}
	return 0;
}
#endif


//1. 5位运动员参加了10米台跳水比赛，有人让他们预测比赛结果
//
//A选手说：B第二，我第三； ( B == 2 || A == 3)  == 1
//B选手说：我第二，E第四；  
//C选手说：我第一，D第二；
//D选手说：C最后，我第三；
//E选手说：我第四，A第一；
//比赛结束后，每位选手都说对了一半，请编程确定比赛的名次。

#if 0
int main()
{
	for (int A = 1; A <= 5; A++)
	{
		for (int B = 1; B <= 5; B++)
		{
			for (int C = 1; C <= 5; C++)
			{
				for (int D = 1; D <= 5; D++)
				{
					for (int E = 1; E <= 5; E++)
					{
						if (A * B * C * D * E == 120)
						{
							//A选手说：B第二，我第三； ( B == 2 || A == 3)  == 1
							//B选手说：我第二，E第四；  
							//C选手说：我第一，D第二；
							//D选手说：C最后，我第三；
							//E选手说：我第四，A第一；
							if ((B == 2) + (A == 3) == 1 &&
								(B == 2) + (E == 4) == 1 &&
								(C == 1) + (D == 2) == 1 &&
								(C == 5) + (D == 3) == 1 &&
								(E == 4) + (A == 1) == 1)
							{
								printf("A = %d, B = %d, C = %d, D = %d, E = %d\n", A, B, C, D, E);
							}
						}
					}
				}
			}
		}
	}
	return 0;
}
#endif



//1. 日本某地发生了一件谋杀案，警察通过排查确定杀人凶手必为4个嫌疑犯的一个。
//以下为4个嫌疑犯的供词 :
//
//A说：不是我。
//B说：是C。
//C说：是D。
//D说：C在胡说
//
//已知3个人说了真话，1个人说的是假话。
//
//现在请根据这些信息，写一个程序来确定到底谁是凶手。

#if 0
int main()
{
	for (int i = 'A'; i <= 'D'; i++)  // 犯人有可能的取值
	{		
		if ((i != 'A') + (i == 'C') + (i == 'D') + (i != 'D') == 3)
		{
			printf("killer is %c\n", i);
		}
	}
	return 0;
}
#endif


#if 0
int main(int argc, char* argv[], char* envp[])
{
	int arr[40][40] = {0};
	arr[0][0] = 1;

	int n = 0;
	scanf("%d", &n);

	//行
	for (int i = 1; i < n; i++)
	{
		//列
		arr[i][0] = 1;
		for (int j = 1; j <= i; j++)
		{
			arr[i][j] = arr[i - 1][j] + arr[i - 1][j - 1];
		}
	}


	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j <= i; j++)
		{
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}
	return 0;
}
#endif

#if 0
int main()
{
	char *(*p)[10];
	char* arr[10];
	p = &arr;
	return 0;
}
#endif


typedef int(*handler)(int);
//如果单单只是传参， 相当于给func函数注册了一个函数， 
//该函数是int返回值， int参数
//但是在func函数内部如果不调用是不会执行注册的函数的
//只有在func函数内部调用了函数指针当中保存的函数地址， 才会执行该函数

void func(handler hand)  
{
	//hand(10);
}

int test(int a)
{
	printf("a = %d\n", a);
	return a;
}

int main()
{
	func(test);


	int arr[3][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	printf("%d\n", (*(arr[0] + 1)));
	return 0;
}